import java.util.HashMap;
import java.util.Map;

public class FruitIntoBaskets {
    // 规则: 窗口内每种数字只能有两个, 不限制出现多少次
    // 找最长的子串
    public int totalFruit(int[] fruits) {
        int n = fruits.length;
        // key-数字的种类  value-该数字出现的次数
        int[] hash = new int[n];
        int kinds = 0; // 记录窗口内数字的种类个数, 超过2 则窗口不合法

        int left = 0, right = 0;
        int len = 0;
        while(right < n) {
            // 1.进窗口(如果当前数字原先是0, 现在出现了一次, 则 kinds++)
            int in = fruits[right];
            if(hash[in] == 0) {
                kinds++;
            }
            hash[in]++;

            // 2.判断
            while(kinds > 2) {
                // 如果窗口内数字种类超过2, 则不合法, 出窗口直至合法
                int out = fruits[left];
                hash[out]--;
                // 这个数字出现次数减到0, 则说明数字种类消去一个, kinds--
                if(hash[out] == 0) {
                    kinds--;
                }
                left++;
            }

            // 窗口合法, 更新结果
            if(right - left + 1 > len) {
                len = right - left + 1;
            }
            right++;
        }
        return len;
    }
}
